#include<bits/stdc++.h>
using namespace std;
using pii=pair<int, int>;
//using ll=long long;
#define loop(x,n) for(int x=0; x<n; x++)
#define loop1(x,n) for(int x=1; x<=n; x++)
#define loopr(x,n) for(int x=n; x-->0;)
#define F first
#define S second
#define pb push_back
#define lb lower_bound
#define mp make_pair
#define all(v) begin(v), end(v)
#define UNTIE_IO ios_base::sync_with_stdio(0);cin.tie(0);
const int MAX=1e6+20;
const int INF=2e9;
const int MOD=998244353;
int dp[MAX][3][3];
int N,M;
int cnt[MAX];
signed main(){
cin>>N>>M;
int x;
loop(i, N){
cin>>x;
cnt[x+3]++;
}
int ans=0;
for(int i=4; i<M+6; i++){
loop(x, 3){
loop(y, 3){
dp[i][x][y] = -INF;
loop(z, 3){
if (x>cnt[i]||x+y>cnt[i-1]||x+y+z>cnt[i-2]||y+z>cnt[i-3]||z>cnt[i-4]) continue;
dp[i][x][y] = max(dp[i][x][y], dp[i-1][y][z]+x+(cnt[i-2]-x-y-z)/3);
}
ans = max(ans, dp[i][x][y]);
}
}
}
cout << ans << '\n';
}
1676G - White-Black Balanced Subtrees | 1716D - Chip Move |
1352F - Binary String Reconstruction | 1487B - Cat Cycle |
1679C - Rooks Defenders | 56A - Bar |
1694B - Paranoid String | 35A - Shell Game |
1684A - Digit Minimization | 43B - Letter |
1017A - The Rank | 1698B - Rising Sand |
235A - LCM Challenge | 1075B - Taxi drivers and Lyft |
1562A - The Miracle and the Sleeper | 1216A - Prefixes |
1490C - Sum of Cubes | 868A - Bark to Unlock |
873B - Balanced Substring | 1401D - Maximum Distributed Tree |
1716C - Robot in a Hallway | 1688B - Patchouli's Magical Talisman |
99A - Help Far Away Kingdom | 622B - The Time |
1688C - Manipulating History | 1169D - Good Triple |
1675B - Make It Increasing | 588A - Duff and Meat |
1541B - Pleasant Pairs | 1626B - Minor Reduction |